package com.itheima.reggie.web.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.reggie.entity.Employee;
import com.itheima.reggie.entity.dto.LoginDto;
import com.itheima.reggie.service.EmployeeService;
import com.itheima.reggie.utils.ThreadLocalUtil;
import com.itheima.reggie.web.R;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.DigestUtils;
import org.springframework.web.bind.annotation.*;

import javax.security.auth.login.LoginContext;
import javax.servlet.http.HttpSession;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 员工控制器
 *
 * @Author Vsunks.v
 * @Date 2022/8/10 8:55
 * @Blog blog.sunxiaowei.net
 * @Description: 员工控制器
 */
@Slf4j
@RestController  // = @Controller + @ResponseBody
@RequestMapping("/employee") // 员工所有请求前缀为/employee
public class EmployeeController {


    @Autowired
    EmployeeService employeeService;


    @Autowired
    HttpSession session;

    @RequestMapping("/all")
    public R<List<Employee>> findAll() {
        List<Employee> employees = employeeService.list();
        return R.success(employees);
    }

    /**
     * 登录，并根据参数校验结果，给出相应提示提示
     *
     * @param loginDto 登录参数封装对象
     * @return 含有Employee对象的R对象的JSON字符串
     */
    @PostMapping("/login")
    public R<Employee> login(@RequestBody LoginDto loginDto) {
        log.info("员工开始登录：登录信息：[{}]", loginDto);

        // 登录并根据参数校验结果，给出提示
        Employee employee = employeeService.login(loginDto);

        // 5. 登陆成功，把员工`ID`存入`session`
        session.setAttribute("employee", employee.getId());
        //
        // 6. 响应登录成功数据到前台
        return R.success(employee);
    }

    /**
     * 员工登出注销
     *
     * @return 操作结果
     */
    @PostMapping("/logout")
    public R logout() {
        log.info("[{}]员工登出", session.getAttribute("employee"));

        // 清理session
        session.removeAttribute("employee");

        // 响应结果
        return R.success("退出成功", null);

    }


    /**
     * 分页查询
     *
     * @param pageNum  页码
     * @param pageSize 页面大小
     * @param name     查询条件，可以为null
     * @return 分页对象
     */
    @GetMapping("/page")
    public R page(@RequestParam("page") Integer pageNum, Integer pageSize, String name) {
        log.info("分页查询，页码：{}，页面大小：{}，查询条件name：{}", pageNum, pageSize, name);

        // 调用service查询
        Page page = employeeService.page(pageNum, pageSize, name);

        // TODO  脱敏处理
        // 组织数据并返回
        return R.success(page);
    }


    /**
     * 保存用户，并校验用户名是否重复
     *
     * @param employee 要保存的员工信息
     * @return 是否保存成功
     */
    @PostMapping
    public R save(@RequestBody Employee employee) {
        log.info("保存员工，信息如下：{}", employee);
        log.info("EmployeeController线程名称：{}", Thread.currentThread().getName());

        // 数据校验

        // 调用Service保存
        boolean result = employeeService.saveWithDataInit(employee);

        // 组织数据并返回
        if (result) {
            return R.success("添加成功");
        }
        return R.fail("添加失败");
    }


    /**
     * 修改员工信息，默认支持按需更新。目前用到的是修改员工的状态
     *
     * @param employee 被修改的员工信息
     * @return 是否修改成功
     */
    @PutMapping
    public R update(@RequestBody Employee employee) {
        log.info("修改员工，信息如下：{}", employee);

        // 参数合理性校验，提高代码的健壮性
        if (employee.getId() == null || (employee.getStatus() != 0 && employee.getStatus() != 1)) {
            return R.fail("参数有误，请修改后重试！");
        }
        // Long employeeId = (Long) session.getAttribute("employee");

        // 更新元数据
        // employee.setUpdateUser(ThreadLocalUtil.getCurrentId());
        // employee.setUpdateTime(LocalDateTime.now());

        // 更新，重写实现校验用户名是否重复
        boolean result = employeeService.updateById(employee);

        if (result) {
            return R.success("修改成功", null);
        }
        return R.fail("修改失败");
    }


    /**
     * 根据id查询员工并返回，返回的对象要脱敏
     *
     * @param id 查询条件，id
     * @return 脱敏后的员工对象
     */
    @GetMapping("/{id}")
    public R<Employee> findById(@PathVariable Long id) {

        // 参数校验，提高代码健壮性

        // 查询
        Employee employee = employeeService.getById(id);

        // 组织数据，并返回
        if (employee == null) {
            return R.fail("查无此员工");
        }
        // TODO 数据脱敏
        return R.success("查询成功", employee);
    }
}
